Don't create or update the tracking rect in the window, move it to the
authorRichard Hult <richard@imendio.com>
Tue, 19 Jun 2007 22:09:56 +0000 (22:09 +0000)
committerRichard Hult <rhult@src.gnome.org>
Tue, 19 Jun 2007 22:09:56 +0000 (22:09 +0000)
2007-06-20  Richard Hult  <richard@imendio.com>

* gdk/quartz/gdkwindow-quartz.c (gdk_window_new):
* gdk/quartz/GdkQuartzWindow.c (windowDidResize): Don't create or
update the tracking rect in the window, move it to the view where
it belongs.

* gdk/quartz/GdkQuartzView.c (updateTrackingRect)
(viewDidMoveToWindow, viewWillMoveToWindow)
(setFrame, setBounds): Create and update the tracking rect here.

svn path=/trunk/; revision=18197

ChangeLog
gdk/quartz/GdkQuartzView.c
gdk/quartz/GdkQuartzView.h
gdk/quartz/GdkQuartzWindow.c
gdk/quartz/gdkwindow-quartz.c

index 6e8fa4c37e1a871c8a737512c6a29bccf7413eeb..bcf505c1c3a8653a08fe11f209ca1e947411bb6d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2007-06-20  Richard Hult  <richard@imendio.com>
+
+       * gdk/quartz/gdkwindow-quartz.c (gdk_window_new): 
+       * gdk/quartz/GdkQuartzWindow.c (windowDidResize): Don't create or
+       update the tracking rect in the window, move it to the view where
+       it belongs.
+
+       * gdk/quartz/GdkQuartzView.c (updateTrackingRect)
+       (viewDidMoveToWindow, viewWillMoveToWindow)
+       (setFrame, setBounds): Create and update the tracking rect here.
+
 2007-06-19  Mathias Hasselmann  <mathias.hasselmann@gmx.de>
 
        * gdk/gdkinternals.h: Restore G_BEGIN_DECLS at the
index 500c0b53be78da4f4701a06b7f8522ce8e6ac8ce..aefcc1407480105b9167338ef8d052e3575525fa 100644 (file)
   GDK_QUARTZ_RELEASE_POOL;
 }
 
+/* For information on seting up tracking rects properly, see here:
+ * http://developer.apple.com/documentation/Cocoa/Conceptual/EventOverview/EventOverview.pdf
+ */
+-(void)updateTrackingRect
+{
+  GdkWindowObject *private = GDK_WINDOW_OBJECT (gdk_window);
+  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
+
+  if (trackingRect)
+    {
+      [self removeTrackingRect:trackingRect];
+      trackingRect = nil;
+    }
+
+  if (!impl->toplevel)
+    return;
+
+  trackingRect = [self addTrackingRect:[self bounds]
+                                 owner:self
+                              userData:nil
+                          assumeInside:NO];
+}
+
+-(void)viewDidMoveToWindow
+{
+  if (![self window]) /* We are destroyed already */
+      return;
+
+  [self updateTrackingRect];
+}
+
+-(void)viewWillMoveToWindow:(NSWindow *)newWindow
+{
+  if ([self window] && trackingRect)
+    {
+      [self removeTrackingRect:trackingRect];
+      trackingRect = nil;
+    }
+}
+
+-(void)setFrame:(NSRect)frame
+{
+  [super setFrame:frame];
+  [self updateTrackingRect];
+}
+-(void)setBounds:(NSRect)bounds
+{
+  [super setBounds:bounds];
+  [self updateTrackingRect];
+}
+
 @end
index 28f6a9377401efc40deb339a8c0cb60cce0e767d..1da55e3773be141d304190b00c749efeff979439 100644 (file)
@@ -23,6 +23,7 @@
 
 @interface GdkQuartzView : NSView {
   GdkWindow *gdk_window;
+  NSTrackingRectTag trackingRect;
 }
 
 -(void)setGdkWindow:(GdkWindow *)window;
index cd18e7f9be5588db8c8a25cfb6a8eebdb5848c07..97c01e79e8cb78e9f8499c001bec1fb5d5676f03 100644 (file)
   impl->height = content_rect.size.height;
 
   /* Synthesize a configure event */
-
   event = gdk_event_new (GDK_CONFIGURE);
   event->configure.window = g_object_ref (window);
   event->configure.x = private->x;
   event->configure.height = impl->height;
 
   _gdk_event_queue_append (gdk_display_get_default (), event);
-
-  /* Update tracking rectangle */
-  [[self contentView] removeTrackingRect:impl->tracking_rect];
-  impl->tracking_rect = [impl->view addTrackingRect:NSMakeRect(0, 0, impl->width, impl->height) 
-                                             owner:impl->view
-                                          userData:nil
-                                      assumeInside:NO];
 }
 
 -(id)initWithContentRect:(NSRect)contentRect styleMask:(unsigned int)styleMask backing:(NSBackingStoreType)backingType defer:(BOOL)flag
                            backing:backingType
                              defer:flag];
 
-
-  /* A possible modification here would be to only accept mouse moved events
-   * if any of the child GdkWindows are interested in mouse moved events.
-   */
   [self setAcceptsMouseMovedEvents:YES];
-
   [self setDelegate:self];
   [self setReleasedWhenClosed:YES];
 
index f538e2100f7745f9ea98c0be5e20c8476d1b7437..a4e62fa929dcfb558ee0c1b2868f0b8f35dc2c8a 100644 (file)
@@ -643,16 +643,17 @@ gdk_window_new (GdkWindow     *parent,
        const char *title;
        int style_mask;
 
-       switch (attributes->window_type) {
-       case GDK_WINDOW_TEMP:
-         style_mask = NSBorderlessWindowMask;
-         break;
-       default:
-         style_mask = (NSTitledWindowMask |
-                       NSClosableWindowMask |
-                       NSMiniaturizableWindowMask |
-                       NSResizableWindowMask);
-       } 
+       switch (attributes->window_type) 
+          {
+          case GDK_WINDOW_TEMP:
+            style_mask = NSBorderlessWindowMask;
+            break;
+          default:
+            style_mask = (NSTitledWindowMask |
+                          NSClosableWindowMask |
+                          NSMiniaturizableWindowMask |
+                          NSResizableWindowMask);
+          }
 
        impl->toplevel = [[GdkQuartzWindow alloc] initWithContentRect:content_rect 
                                                            styleMask:style_mask
@@ -665,7 +666,7 @@ gdk_window_new (GdkWindow     *parent,
          title = get_default_title ();
 
        gdk_window_set_title (window, title);
-         
+  
        if (draw_impl->colormap == gdk_screen_get_rgba_colormap (_gdk_screen))
          {
            [impl->toplevel setOpaque:NO];
@@ -675,14 +676,9 @@ gdk_window_new (GdkWindow     *parent,
        impl->view = [[GdkQuartzView alloc] initWithFrame:content_rect];
        [impl->view setGdkWindow:window];
        [impl->toplevel setContentView:impl->view];
-
-       /* Add a tracking rect */
-       impl->tracking_rect = [impl->view addTrackingRect:NSMakeRect(0, 0, impl->width, impl->height) 
-                                                   owner:impl->view
-                                                userData:nil
-                                            assumeInside:NO];
       }
       break;
+
     case GDK_WINDOW_CHILD:
       {
        GdkWindowImplQuartz *parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (parent)->impl);
@@ -701,6 +697,7 @@ gdk_window_new (GdkWindow     *parent,
          }
       }
       break;
+
     default:
       g_assert_not_reached ();
     }